import Dexie from 'dexie';
import type {Table} from "dexie";
// 定义 UserDB 类
class UserDB extends Dexie {
  userInfoTab!: Table<userInfoType>;
  
  constructor(dnName:string) {
    super(dnName);
    this.version(1).stores({
      userInfoTab:'_account'
    });
  }
}
let timer:number = 0;
export let userDB:UserDB ;
/**
 * 添加用户信息到数据库
 * @param {userInfoType} user - 用户信息对象
 * @return {Promise<boolean>} - 添加成功返回 true，否则返回 false
 */
export const addUserToDB = async (user:userInfoType):Promise<boolean> => {
  if (!userDB) {
    return false;
  }
  try {
    await userDB.userInfoTab.put(user);
    return true;
  } catch (e) {
    return false;
  }
}

/**
 * 将用户信息列表添加到数据库中
 * @param {userInfoType[]} userList - 用户信息列表
 * @return {Promise<boolean>} - 添加成功返回 true，否则返回 false
 */
export const addUserListToDB = async (userList:userInfoType[]):Promise<boolean> => {
  if (!userDB) {
    return false;
  }
  try {
    for (let i = 0; i < userList.length; i++) {
      await userDB.userInfoTab.put(userList[i]);
    }
    return true;
  } catch (e) {
    return false;
  }
}
/**
 * 更新用户信息到数据库
 * @param {userInfoType} user - 用户信息对象
 * @return {Promise<boolean>} - 更新成功返回 true，否则返回 false
 */
export const updateUserToDB = async (user:userInfoType):Promise<boolean> => {
  if (!userDB) {
    return false;
  }
  try {
    await userDB.userInfoTab.update(user._account, user);
    return true;
  } catch (e) {
    return false;
  }
}

// 缓存用户信息
const userInfoCache:{ [key: string]: userInfoType } = {};

/**
 * 根据账号获取用户信息
 * @param {string} _account - 用户账号
 * @return {Promise<userInfoType|undefined>} - 返回用户信息对象或 undefined
 */
export const getUserInfoFromDB = async (_account:string):Promise<userInfoType|undefined> => {
  if (_account && userInfoCache[_account]){
    return userInfoCache[_account];
  }
  let result:userInfoType|undefined = undefined;
  if (!userDB) {
    return result;
  }
  try {
    result = await userDB.userInfoTab.get(_account);
    // 缓存用户信息
    if (_account && result) {
      userInfoCache[_account] = result;
    }
    return result;
  } catch (e) {
    return result;
  }
}
// 初始化 userDB
timer = setInterval(() => {
  if (!userDB) {
    userDB = new UserDB(`socketChatUserInfo`);
    return;
  }
  clearInterval(timer);
},10);
